/**
 * 抖音直播大屏数据port处理接口
 */

import moment from "moment"

import type { PlasmoMessaging } from "@plasmohq/messaging"

// 实例数据
let dyLiveScreenData = {}

// 更新数据
const updateLiveScreenData = (data: object) => {
  dyLiveScreenData = {
    ...dyLiveScreenData,
    ...data
  }
}

// 日期时间格式处理方法
const formatDateTime = (value: string) => {
  if (!value) return ""
  return moment(value).format("YYYY-MM-DD HH:mm:ss")
}

// 基础数据过滤器
const baseInfoFilter = (url: string, response: any) => {
  // 正则匹配url
  // 基础数据
  // 匹配 */compass_api/shop/live/live_screen/live_base_info*
  // 构建正则
  const baseInfoReg = new RegExp(
    `^https://compass.jinritemai.com/compass_api/shop/live/live_screen/live_base_info`
  )
  // 达人版地址
  const baseInfoReg2 = new RegExp(
    `^https://compass.jinritemai.com/compass_api/author/live/live_screen/live_base_info`
  )
  if (baseInfoReg.test(url) || baseInfoReg2.test(url)) {
    const baseData = response.data
    // 获取主播间名称，开始时间，结束时间，如果没有live_end_time，说明直播还在进行中
    // 更新 liveScreenData
    updateLiveScreenData({
      live_room: baseData["nickname"] || "",
      live_start_time: formatDateTime(baseData["live_start_time"] || ""),
      live_end_time: formatDateTime(baseData["live_end_time"] || ""),
      live_end: baseData["live_end_time"] !== ""
    })
    return true
  }
  return false
}

// 核心数据过滤器
const coreDataFilter = (url: string, response: any) => {
  // 核心数据
  // 匹配 */compass_api/shop/live/live_screen/core_data*
  // 构建正则
  const coreDataReg = new RegExp(
    `^https://compass.jinritemai.com/compass_api/shop/live/live_screen/core_data`
  )
  // 达人版地址
  const coreDataReg2 = new RegExp(
    `^https://compass.jinritemai.com/compass_api/author/live/live_screen/core_data`
  )
  if (coreDataReg.test(url) || coreDataReg2.test(url)) {
    const coreData = {}
    // 获取直播间核心数据
    // 判断是否有core_data，且是否为列表
    const core_data = response.data["core_data"] || []
    const coreNameMap = {
      曝光次数: "exposure",
      "曝光-观看率(次数)": "exposure_click_rate",
      // 直播PV: "live_pv",
      累计观看人数: "live_uv",
      人均观看时长: "live_viewtime",
      新增粉丝数: "live_addfensi",
      成交件数: "deal_count",
      成交人数: "live_sale_count",
      成交老粉占比: "live_sale_old_fans"
    }
    if (Array.isArray(core_data)) {
      core_data.forEach((item) => {
        const { index_display, value } = item
        // 名称匹配
        const key = coreNameMap[index_display]
        if (key) {
          coreData[key] = value["value"]
        }
      })
    }
    coreData["live_sale_amount"] =
      (response.data["pay_amt"] || {})["value"] || 0
    if (coreData["live_sale_amount"] > 0) {
      coreData["live_sale_amount"] = Math.round(
        coreData["live_sale_amount"] / 100
      )
    }
    if (
      Object.hasOwn(coreData, "exposure") &&
      Object.hasOwn(coreData, "exposure_click_rate")
    ) {
      // 计算live_pv
      coreData["live_pv"] = Math.round(
        coreData["exposure"] * coreData["exposure_click_rate"]
      )
    }
    if (
      Object.hasOwn(coreData, "live_sale_count") &&
      Object.hasOwn(coreData, "live_sale_old_fans")
    ) {
      // 计算成交老粉数
      coreData["live_sale_old_fans"] = Math.round(
        coreData["live_sale_count"] * coreData["live_sale_old_fans"]
      )
    }
    // 更新 liveScreenData
    updateLiveScreenData(coreData)
  }
  return false
}

const handler: PlasmoMessaging.PortHandler = async (req, res) => {
  const { url, response, action } = req.body
  if (action === "init") {
    dyLiveScreenData = {}
  } else {
    const filters = [baseInfoFilter, coreDataFilter]
    filters.forEach((filter) => filter(url, response))
  }
  res.send(dyLiveScreenData)
}

export default handler
